package com.bgba.oer;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.rpc.ServiceException;

import com.bgba.oer.sharepoint.OperationSharepoint;
import com.bgba.oer.sharepoint.SystemSharepoint;
import com.flashline.registry.openapi.base.OpenAPIException;
import com.flashline.registry.openapi.entity.AuthToken;
import com.flashline.registry.openapi.entity.Asset;
import com.flashline.registry.openapi.service.v300.FlashlineRegistry;
import
com.flashline.registry.openapi.service.v300.FlashlineRegistryServiceLocator;
import com.flashline.registry.openapi.entity.Categorization;
import com.flashline.registry.openapi.entity.CategorizationType;
import com.flashline.registry.openapi.query.CategorizationTypeCriteria;
public class OperationImporter {

	public static void main(String pArgs[]) throws ServiceException, ParserConfigurationException, SAXException, IOException  {

		System.out.println("======================== ");
		String urlConnectionLogin = "http://desasoa01/oer/services/FlashlineRegistry?WSDL";
		String username = " L0269239";
		String password = "finde2011";
		/*
		String urlConnectionLogin = "http://172.17.1.10:8101/oer/services/FlashlineRegistry?WSDL";
		String username = " admin";
		String password = "admin123";
		 */
		///////////////////////////////////////////////////////////
		// Connect to Oracle Enterprise Repository
		///////////////////////////////////////////////////////////
		URL lURL = null;
		lURL = new URL(urlConnectionLogin);
		FlashlineRegistry repository = new FlashlineRegistryServiceLocator().getFlashlineRegistry(lURL);

		///////////////////////////////////
		// Login to OER
		///////////////////////////////////
		AuthToken authToken = repository.authTokenCreate(username, password);


		////////////////////////////////////////////////////////
		// Parse XML de Operaciones exportado de SharePoint
		////////////////////////////////////////////////////////
		List<OperationSharepoint> operationSharepointList = parseOperationXml();
		
		for (OperationSharepoint operationSharepoint : operationSharepointList) {
			System.out.println("=== OperationSharepoint.OperacionFuncional="+operationSharepoint.getOperacionFuncional());
		}

		String pepe = null;
		pepe.trim();
		
		try {			
			String unaCadenaNull = null;
			unaCadenaNull.trim();


			///////////////////////////////////
			// read an asset's tabs
			///////////////////////////////////
			//      lTabBeans = repository.assetTabsRead(authToken, 50234);
			Asset myAsset = repository.assetCreate(authToken, "otra operacion programatica","1.0", 50044);
			//      Asset myAsset = repository.assetRead(authToken, 50234);
			//repository.assetUpdateCustomDataString(authToken, myAsset.getID(), "/asset","<asset><custom-data><dummy-port>1234</dummy-port></custom-data></asset>");
			//      repository.assetUpdateCustomDataString(authToken, myAsset.getID(), "custom-data/dummy-port","1236");

			//repository.assetUpdateCustomDataNode(authToken, myAsset.getID(), "","<custom-data><dummy-port>1236</dummy-port></custom-data>");
			//      repository.assetUpdateCustomDataNode(authToken, myAsset.getID(), "","<custom-data><dummy-development-date>09 Mar 2009</dummy-development-date></custom-data>");
			//repository.assetUpdateCustomDataNode(authToken, myAsset.getID(), "","<mandatory-data><categorization-types><Validity>50039</Validity></categorization-types></mandatory-data>");
			//CategorizationType[] lAllCatTypes = null;
			//Categorization[] lAllCats = null;

			repository.assetUpdateCustomDataString(authToken, myAsset.getID(), "dummy-port","1237");

			String dummyPort = repository.assetReadCustomDataString(authToken, myAsset.getID(), "dummy-port");
			System.out.println("============ myAsset.getID="+myAsset.getID()+", dummy-port="+dummyPort);

			Categorization[] vigenteCat = new Categorization[1];

			vigenteCat[0] =  repository.categorizationRead(authToken, 50039);
			//vigenteCat[0] =  repository.categorizationReadByType(authToken, pCategorizationType, TRUE, TRUE) 

			//lAllCatTypes = myAsset.getCategorizationTypes();
			myAsset = repository.assetRead(authToken, myAsset.getID());
			myAsset.setCategorizations(vigenteCat);
			myAsset.setDescription("La descripcion");
			repository.assetUpdate(authToken, myAsset);

			//      System.out.println(lTabBeans);
		} catch (OpenAPIException lEx) {
			System.out.println("ServerCode = " + lEx.getServerErrorCode());
			System.out.println("Message    = " + lEx.getMessage());
			System.out.println("StackTrace:");
			lEx.printStackTrace();
		} catch (RemoteException lEx) {
			lEx.printStackTrace();
		}

	}

	public static List<OperationSharepoint> parseOperationXml() throws ParserConfigurationException, SAXException, IOException {

		// lista de operaciones de Sharepoint
		List<OperationSharepoint> operationList = new ArrayList<OperationSharepoint>();


		//File file = new File("C:\\UnaOperacionCorporativa.xml");
		File file = new File("/home/alex/galicia/oer_migracion/OER/OperacionesCorporativas.xml");
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document doc = db.parse(file);
		doc.getDocumentElement().normalize();
		System.out.println("Root element " + doc.getDocumentElement().getNodeName());
		//NodeList nodeLst = doc.getElementsByTagName("Operación_x0020_Funcional");
		NodeList nodeLst = doc.getElementsByTagName("Operaciones_x0020_Corporativas");
		System.out.println("Informacion de las Oper Corp");

		for (int s = 0; s < nodeLst.getLength(); s++) {

			Node fstNode = nodeLst.item(s);

			if (fstNode.getNodeType() == Node.ELEMENT_NODE) {
				OperationSharepoint operationSharepoint = new OperationSharepoint();

				Element fstElmnt = (Element) fstNode;
				String id = getNodeValueByTagName(fstElmnt, "ID");
				System.out.println("====== Operacion.id="+id);
				operationSharepoint.setId(Integer.parseInt(id));

				String nombreFuncional = getNodeValueByTagName(fstElmnt, "Nombre_x0020_Funcional_x0020_Servicio");
				System.out.println("====== Operacion.nombreFuncional="+nombreFuncional);
				// ??????????????????????????????????????
				// operationSharepoint.setF

				String operacionFuncional = getNodeValueByTagName(fstElmnt, "Operación_x0020_Funcional");
				System.out.println("====== Operacion.operacionFuncional="+operacionFuncional);
				operationSharepoint.setOperacionFuncional(operacionFuncional);

				String versionOperacion = getNodeValueByTagName(fstElmnt, "Versión_x0020_de_x0020_la_x0020_operación");
				System.out.println("====== Operacion.versionOperacion="+versionOperacion);
				operationSharepoint.setVersion(versionOperacion);

				String descripcion = getNodeValueByTagName(fstElmnt, "Descripción");
				System.out.println("====== Operacion.descripcion="+descripcion);
				operationSharepoint.setDescripcion(descripcion);

				String estado = getNodeValueByTagName(fstElmnt, "Estado");
				System.out.println("====== Operacion.estado="+estado);
				operationSharepoint.setEstado(estado);

				String comentarioEstado = getNodeValueByTagName(fstElmnt, "Comentarios_x0020_del_x0020_Estado");
				System.out.println("====== Operacion.comentarioEstado="+comentarioEstado);
				operationSharepoint.setComentariosEstado(comentarioEstado);

				String alcance = getNodeValueByTagName(fstElmnt, "Alcance");
				System.out.println("====== Operacion.alcance="+alcance);
				operationSharepoint.setAlcance(alcance);

				String vigencia = getNodeValueByTagName(fstElmnt, "Vigencia");
				System.out.println("====== Operacion.vigencia="+vigencia);
				operationSharepoint.setVigencia(vigencia);


				//seguir con las valores de forma ordenada



				String fechaDummyDesarrollo = getNodeValueByTagName(fstElmnt, "Fecha_x0020_Dummy_x0020_Desarrollo");
				System.out.println("====== Operacion.fechaDummyDesarrollo="+fechaDummyDesarrollo);
				operationSharepoint.setFechaDummyDesarrollo(fechaDummyDesarrollo);

				operationList.add(operationSharepoint);


				/*
				NodeList fstNmElmntLstDesarrollo = fstElmnt.getElementsByTagName("Fecha_x0020_Dummy_x0020_Desarrollo");
				Element fstNmElmntDesarrollo = (Element) fstNmElmntLstDesarrollo.item(0);
				NodeList fstNmDesarrollo = fstNmElmntDesarrollo.getChildNodes();
				System.out.println("Operacion : "  + ((Node) fstNmDesarrollo.item(0)).getNodeValue());

				NodeList lstNmElmntLst = fstElmnt.getElementsByTagName("Estado");
				Element lstNmElmnt = (Element) lstNmElmntLst.item(0);
				NodeList lstNm = lstNmElmnt.getChildNodes();
				System.out.println("Estado : " + ((Node) lstNm.item(0)).getNodeValue());
				 */
				//			"Operación_x0020_Funcional"			name en AssetCreate
				//			"Operación_x0020_Técnica" 			custom-data/technical-name
				//			"Versión_x0020_de_x0020_la_x0020_operación" 	mandatory-data/version
				//			"Descripción" 						mandatory-data/description
				//			"Estado" 							mandatory-data/categorization-types/OperationStatus
				//			"Comentarios_x0020_del_x0020_Estado" 			custom-data/comments
				//			"Alcance" 							mandatory-data/categorization-types/Scope
				//			"Vigencia" 							mandatory-data/categorization-types/Validity
				//			"Reemplazada_x0020_por" 			<relacion>
				//			"Documentación_x0020_del_x0020_servicio" 		??????
				//			"Fecha_x0020_de_x0020_Interfaces_x0020_Corp" 	custom-data/interface-date
				//			"Puerto_x0020_Dummy" 				custom-data/dummy-port
				//			"Puerto_x0020_Desarrollo" 			custom-data/development-port
				//			"Puerto_x0020_Integración" 			custom-data/integration-port
				//			"Puerto_x0020_Homologación" 		custom-data/homologation-port
				//			"Puerto_x0020_Producción" 			custom-data/production-port
				//			"Información_x0020_Adicional_x0020_del_x0020_Protocolo" 	custom-data/protocol-additional-information
				//			"Fecha_x0020_Dummy_x0020_Desarrollo" 						custom-data/dummy-development-date
				//			"Fecha_x0020_Comienzo_x0020_Desarrollo" 					custom-data/start-development-date
				//			"Fecha_x0020_Fin_x0020_Desarrollo" 							custom-data/end-development-date
				//			"Fecha_x0020_Homologación" 									custom-data/homologation-date
				//			"Fecha_x0020_Producción" 									custom-data/production-date
				//			"Analisis_x0020_asignado_x0020_a" 							<relacion>
				//			"Desarrollo_x0020_asignado_x0020_a" 						<relacion>
				//			"Prioridad" 												custom-data/priorities
				//			"Nombre_x0020_servicio_x0020_backend_x0020__x0028_Proveedor_x0029_" 	custom-data/backend-service-name
				//			"Nombre_x0020_operación_x0020_backend_x0020__x0028_Proveedor_x0029_" 	custom-data/backend-operation-name
				//			"Nombre_x0020_función_x0020_backend_x0020__x0028_Proveedor_x0029_" 		custom-data/backend-function-name
				//			"Nombre_x0020_programa_x0020_backend_x0020__x0028_Proveedor_x0029_" 	custom-data/backend-program-name
				//			"Lista_x0020_de_x0020_Copys_x0020_utilizados_x0020__x0028_Proveedor_x0029_" 	<a definir tambien un campo libre?>
				//			"Documentación_x0020_de_x0020_Diseño_x0020_y_x0020_Técnica_x0020__x0028_Proveedor_x0029_" 
				//			"Documento_x0020_Diseño_x0020_del_x0020_Servicio_x0020__x0028_obsoleto_x0029_" 
				//			"URL_x0020_del_x0020_Proveedor" 
				//			"Notas_x0020_de_x0020_diseño" 
				//			"Nombre_x0020_de_x0020_la_x0020_tarea_x0020__x007C__x0020_Project" 
				//			"Tipo_x0020_de_x0020_contenido" 
				//			"Tipo_x0020_de_x0020_archivo" 
				//			"Protocolo" 														
				//			"Id_x0023__x0020_de_x0020_instancia_x0020_de_x0020_flujo_x0020_de_x0020_trabajo"	
			}
		}
		return operationList;		
	}

	public static String getNodeValueByTagName(Element fstElmnt, String tagName) {
		NodeList fstNmElmntLst = fstElmnt.getElementsByTagName(tagName);
		Element fstNmElmnt = (Element) fstNmElmntLst.item(0);
		//System.out.println("== fstNmElmnt.getTagName="+fstNmElmnt.getTagName());
		//System.out.println("== fstNmElmnt.getNodeValue="+fstNmElmnt.getNodeValue());
		NodeList fstNm = fstNmElmnt.getChildNodes();
		String value =  ((Node) fstNm.item(0)).getNodeValue();
		System.out.println("tagName="+tagName+", value="+value);
		return value;

	}
}